CloudTrail Lakeで特定のS3バケットのデータイベントのみを収集するイベントデータストアを作成してみた
アノテーション テクニカルサポートの小川です。
S3オブジェクトへのアクセス拒否エラーの原因を調査する際、主に以下の要素からアクセス拒否の原因を考えます。
- IAMユーザーなど、アクセスを試みる主体のIAMポリシーやアクセス許可の境界
- バケットポリシーやオブジェクト所有者などS3の設定
- S3の暗号化設定に使用したKMSのキーポリシー
- SCP
しかし、ポリシーが複雑な場合など原因が断定できないときもあるため、そのようなときはS3オブジェクトへのリクエストログを確認します。
S3オブジェクトのリクエストログは
- S3のサーバーアクセスログ
- CloudTrail証跡(該当のS3のデータイベントを記録する設定をしていることが前提)
- CloudTrail Lake(同上)
から確認できます(サーバーアクセスログよりCloudTrailの方が詳細な情報を確認可能)。
上記のうち、CloudTrail Lakeで確認したことがなかったため、該当のS3データイベントのみを収集するCloudTrail Lakeイベントデータストアを作成してみました。
なお、サーバーアクセスログ、CloudTrail証跡、CloudTrail Lakeいずれにしても、作成・有効にする以前に行ったリクエストのログは確認できませんので、お気をつけください。
CloudTrail Lake とは
簡単にいうと、CloudTrailイベントに対して、Athenaなしでクエリを実行できる機能です。
イベントデータストアを作成する
CloudTrail Lakeを利用するには、まずイベントデータストアの作成が必要です。
特定のS3バケットのみデータイベントを収集するには、ログセレクターテンプレートを「カスタム」に設定し、高度なイベントセレクターで、以下のように設定します。
フィールド | resources.ARN |
オペレーター | 次で始まる |
Value | S3バケットのARN/ |
上記ではValue末尾の「/」が重要です。
例えば、Value末尾を「bucket-name」とスラッシュなしにした場合、「bucket-name-log」というバケットのデータイベントも収集されてしまいます。
S3 バケット ARN を使用することによって高度なイベントセレクターでデータイベントを除外または含めるには、常に [Starts with] (次で始まる) オペレーターを使用してください。
引用元:イベントデータストアを作成する
ただし、将来的にはこの設定方法ではなく、記録したいS3バケットを簡単に選択できるようになるかもしれません。
証跡で特定のS3バケットのデータイベントを記録する際は、以下のようにシンプルに設定できます。
最後に内容を確認の上、データイベントを作成して終了です。
クエリしてみる
Athenaと同様、以下のようにクエリできます。
以下では、eventNameがGetObject
であるログが、イベント時刻とバケット名だけ出力されています。
SELECT eventTime,element_at(requestParameters, 'bucketName') FROM xxx WHERE eventName='GetObject';
出力された5個のバケットは、1つを除いて指定したS3バケットのものです。
4番目の結果だけは別のS3バケットですが、これは一時的に収集するイベントを、以下のようにValue末尾の「/」なしで設定した時に収集されたログになります。
フィールド | resources.ARN |
オペレーター | 次で始まる |
Value | S3バケットのARN |
末尾のスラッシュなしの場合、このように特定のS3バケット以外のデータイベントが収集されることもあるので、特定のS3バケットのみデータイベントを収集したい場合は、Valueの末尾にスラッシュを付けることを忘れないようにしましょう。
参考資料
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、さまざまな背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。